#pragma once
#include <string>
#include <memory> // std::auto_ptr
#include <cstdlib> // std::exit
#include <iostream>
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>
#include "logger.hpp"
#include "chat_session_member.hxx"
#include "chat_session_member-odb.hxx"
#include "mysql.hpp"

namespace zrb
{
    //使用ODB框架对会话成员表的操作
    class ChatSessionMemberTable
    {
    public:
        using ptr = std::shared_ptr<ChatSessionMemberTable>;
        ChatSessionMemberTable(const std::shared_ptr<odb::core::database>& db)
            :_db(db)
        {}

        //向指定会话中添加单个成员
        bool append(Session_member& sm)
        {
            try 
            {
                //3.获取事务对象开启事务
                odb::transaction trans(_db->begin());
                _db->persist(sm);
                //4.提交事务
                trans.commit();
            }
            catch (std::exception &e) 
            {
                LOG_ERROR("插入{}会话数据出错：{}",sm.user_id(),e.what());
                return false;
            }
            return true;
        }

        //向指定会话中添加多个成员。
        bool append(std::vector<Session_member>& sm_lists)
        {
            try 
            {
                //3.获取事务对象开启事务
                odb::transaction trans(_db->begin());
                for(auto& sm : sm_lists) //for循环添加多个数据
                {
                    _db->persist(sm);
                }
                //4.提交事务
                trans.commit();
            }
            catch (std::exception &e) 
            {
                LOG_ERROR("插入多会话数据出错：{}-{}",sm_lists.size(),e.what());
                return false;
            }
            return true;
        }

        //从指定会话中删除单个成员
        bool remove(Session_member& sm)
        {
            try 
            {
                //3.获取事务对象开启事务
                odb::transaction trans(_db->begin());
                typedef odb::query<Session_member> query;
                typedef odb::result<Session_member> result;
                _db->erase_query<Session_member>(query::session_id == sm.session_id() &&
                    query::user_id == sm.user_id()); //删除条件
                //4.提交事务
                trans.commit();
            }
            catch (std::exception &e) 
            {
                LOG_ERROR("删除单会话数据出错：{}",e.what());
                return false;
            }
            return true;
        }

        //通过会话 ID，获取会话的所有成员 ID
        std::vector<std::string> member(const std::string& ssid)
        {

            std::vector<std::string> res;
            try {
                //获取事务对象开启事务
                odb::transaction trans(_db->begin());
                typedef odb::query<Session_member> query;
                typedef odb::result<Session_member> result;

                //查询
                result r(_db->query<Session_member>(query::session_id == ssid));

                //遍历
                for (auto it = r.begin(); it != r.end(); ++it) 
                {
                    res.push_back(it->user_id());
                }
                //5. 提交事务
                trans.commit();
            }
            catch (std::exception &e) 
            {
                LOG_ERROR("查询某个会话的成员出错：{}",e.what());
            }
            return res;
        }

        //删除会话所有成员：在删除会话的时候使用。
        bool remove(const std::string& ssid)
        {
            try 
            {
                //3.获取事务对象开启事务
                odb::transaction trans(_db->begin());
                typedef odb::query<Session_member> query;
                typedef odb::result<Session_member> result;
                _db->erase_query<Session_member>(query::session_id == ssid); //删除条件
                //4.提交事务
                trans.commit();
            }
            catch (std::exception &e) 
            {
                LOG_ERROR("插入多会话数据出错：{}",e.what());
                return false;
            }
            return true;
        }


    private:
        std::shared_ptr<odb::core::database> _db; 
    };
}